bitkeeper revision 1.1159.258.151 (428f2c2a_3sOeZVGhQutbJc15aCU9g)
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Sat, 21 May 2005 12:40:10 +0000 (12:40 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Sat, 21 May 2005 12:40:10 +0000 (12:40 +0000)
Fix e1000 hang during reboot bug.  Kudos to Steven Hand for analyzing.
time.c:
  Fix bug in code which sets our one-shot timer when we decide to block during
  the idle loop.
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c

index bf8e8f9d9006ae82108388835275faeb376c089f..e013191f7b1f94a24d772d1d6b2ba1d7201a707b 100644 (file)
@@ -656,7 +656,12 @@ void __init time_init(void)
 /* Convert jiffies to system time. Call with xtime_lock held for reading. */
 static inline u64 __jiffies_to_st(unsigned long j) 
 {
-       return processed_system_time + ((j - jiffies) * NS_PER_TICK);
+       long delta = j - jiffies;
+       /* NB. The next check can trigger in some wrap-around cases, but
+        * that's ok -- we'll just end up with a shorter timeout. */
+       if (delta < 1)
+               delta = 1;
+       return processed_system_time + (delta * NS_PER_TICK);
 }
 
 /*
@@ -683,8 +688,6 @@ int set_timeout_timer(void)
         * updates of jiffies since interrupts are off.
         */
        j = next_timer_interrupt();
-       if (j < (jiffies + 1))
-               j = jiffies + 1;
        alarm = __jiffies_to_st(j);
 
        /* Failure is pretty bad, but we'd best soldier on. */